#define _CRT_SECURE_NO_WARNINGS 1



#include<iostream>
using namespace std;


//Cpp在执行时，将内存大致分为有4个区域:
//
//代码区:  所写的所有代码均会放入代码区，由操作系统进行管理。
//
//全局区 : 存放全局变量，静态变量以及常量。全局区的内存在程序执行结束后，系统自动释放。
//
//栈区 : 一般存放局部变量和函数的参数，由编译器自动分配和释放。
//
//堆区 : 由程序员分配和释放，程序结束时，没有释放的空间由操作系统回收。

//int* func()
//{
//	int* a = new int(10);//其中，指针变量a还是在栈区，但他储存的地址指向的数据储存在堆区
//	return a;
//}
//
//
//int main()
//{
//	//堆区用new开辟内存
//	int* p = func();
//	cout << *p << endl;
//}



// new关键字在堆区申请内存，delete关键字在堆区释放内存
int* func()
{
	//在堆区创建整型数据
	//new返回的是该数据的指针
	int* p = new int(10);
	return p;
}

void test01()
{
	int* p = func();
	cout << *p << endl;
	cout << *p << endl;
	cout << *p << endl;
	
	//堆区的数据由程序员开辟和释放
	//delete释放
	delete p;
	cout << *p << endl;//数据所占内存已释放，不能再访问
}

// 在堆区利用new开辟数组
void test02()
{
	//创建10个整型数据的数组，在堆区
	int* arr = new int[10];  // [ ]代表数组， 10代表数组有10个元素
	//返回首元素地址由指针变量arr接收。

	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}

	//释放堆区数组
	delete[] arr; //[]代表释放的是数组
	//释放后不能再访问该内存。
}


int main()
{
	//test01();
	test02();
}


